preg_match_all 字符串中匹配正则表达式
基本语法如下:
int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
参数说明:
$pattern
:要匹配的正则表达式模式。$subject
:要在其中进行匹配的字符串。$matches
:可选参数,用于存储匹配结果。是一个二维数组,其中每个子数组都包含一个匹配的子字符串。$flags
:可选参数,用于指定匹配的选项。可以是以下常量的按位或:PREG_PATTERN_ORDER
(默认值,按模式匹配的顺序返回结果数组)或PREG_SET_ORDER
(按模式集合的顺序返回结果数组)。$offset
:可选参数,指定从字符串的哪个偏移量开始进行匹配。
函数返回匹配的总数。
下面是一个简单的示例,演示如何使用 preg_match_all
函数来匹配字符串中的 URL:
$text = "Visit my website: http://www.goodtext.cn";
$pattern = "/http[s]?://\S+/";
$matches = array();
preg_match_all($pattern, $text, $matches);
print_r($matches[0]);
输出结果将是:
Array
(
[0] => http://www.goodtext.cn
)
这个例子中,我们使用正则表达式模式 /http[s]?://\S+/
来匹配 URL。preg_match_all
函数将在 $text
字符串中查找所有匹配的 URL,并将结果存储在 $matches
数组中。最后,我们通过打印 $matches[0]
来输出匹配的 URL。
$flags
和 $offset
参数,它们的作用分别是:
$flags
:用于指定匹配的选项。它可以是以下常量的按位或:PREG_PATTERN_ORDER
(默认值,按模式匹配的顺序返回结果数组)PREG_SET_ORDER
(按模式集合的顺序返回结果数组)。
$offset
:可选参数,指定从字符串的哪个偏移量开始进行匹配。
以下是一个示例,展示了如何使用 $flags
和 $offset
参数:
$text = "Hello, 1234567890 World!";
$pattern = "/\d+/"; // 匹配数字
$matches = array();
$result = preg_match_all($pattern, $text, $matches, PREG_SET_ORDER, 6);
print_r($matches);
在这个例子中,我们使用 PREG_SET_ORDER
作为 $flags
的值,以按模式集合的顺序返回结果数组。同时,我们将 $offset
设置为 6,这意味着从字符串的第 6 个字符开始进行匹配。结果数组 $matches
将包含所有匹配的数字。
请注意,根据你的具体需求,可以调整 $flags
和 $offset
的值来满足你的匹配需求。
PREG_PATTERN_ORDER 和 PREG_SET_ORDER 、PREG_OFFSET_CAPTURE 是 PHP中 preg_match_all
函数的选项参数,用于指定返回的匹配结果数组的排列顺序。
PREG_PATTERN_ORDER
(默认值):按照正则表达式的顺序返回匹配的结果数组。即第一个正则表达式匹配的结果将出现在结果数组的第一个位置,第二个正则表达式匹配的结果将出现在结果数组的第二个位置,以此类推。PREG_SET_ORDER
:按照正则表达式集合的顺序返回匹配的结果数组。即所有与正则表达式集合中的第一个正则表达式匹配的结果将出现在结果数组的第一个位置,所有与第二个正则表达式集合中的正则表达式匹配的结果将出现在结果数组的第二个位置,以此类推。
这两个选项参数的选择取决于你对匹配结果数组的排列需求。如果你希望按照正则表达式的顺序获取匹配结果,可以保持默认的 PREG_PATTERN_ORDER
。如果你希望按照正则表达式集合的顺序获取匹配结果,可以指定 PREG_SET_ORDER
。
以下是 PREG_PATTERN_ORDER
和 PREG_SET_ORDER、 PREG_OFFSET_CAPTURE
的示例:
$text = '<a href="http://www.baidu.com/">百度</a><a href="http://www.google.com/">谷歌</a><a href="https://www.goodtext.cn/">GoodText.cn</a>';
$subject = '|<a href="(.*?)">(.*?)</a>|';
$matches = array();
// Using PREG_PATTERN_ORDER
preg_match_all($subject, $text, $matches, PREG_PATTERN_ORDER);
print_r($matches);
// Using PREG_SET_ORDER
preg_match_all($subject, $text, $matches, PREG_SET_ORDER);
print_r($matches);
// Using PREG_SET_ORDER
preg_match_all($subject, $text, $matches, PREG_SET_ORDER);
print_r($matches);
输出结果:
Array
(
[0] => Array
(
[0] => <a href="http://www.baidu.com/">百度</a>
[1] => <a href="http://www.google.com/">谷歌</a>
[2] => <a href="https://www.goodtext.cn/">GoodText.cn</a>
)
[1] => Array
(
[0] => http://www.baidu.com/
[1] => http://www.google.com/
[2] => https://www.goodtext.cn/
)
[2] => Array
(
[0] => 百度
[1] => 谷歌
[2] => GoodText.cn
)
)
Array
(
[0] => Array
(
[0] => <a href="http://www.baidu.com/">百度</a>
[1] => http://www.baidu.com/
[2] => 百度
)
[1] => Array
(
[0] => <a href="http://www.google.com/">谷歌</a>
[1] => http://www.google.com/
[2] => 谷歌
)
[2] => Array
(
[0] => <a href="https://www.goodtext.cn/">GoodText.cn</a>
[1] => https://www.goodtext.cn/
[2] => GoodText.cn
)
)
Array
(
[0] => Array
(
[0] => <a href="http://www.baidu.com/">百度</a>
[1] => http://www.baidu.com/
[2] => 百度
)
[1] => Array
(
[0] => <a href="http://www.google.com/">谷歌</a>
[1] => http://www.google.com/
[2] => 谷歌
)
[2] => Array
(
[0] => <a href="https://www.goodtext.cn/">GoodText.cn</a>
[1] => https://www.goodtext.cn/
[2] => GoodText.cn
)
)
GoodText.cn在上面的示例中,我们有一个包含正则表达式的数组 $patterns
,以及一个包含要搜索的文本的字符串 $text
。我们使用 preg_match_all
函数来搜索文本中匹配正则表达式的内容,并将匹配结果存储在 $matches
数组中。